/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.sonrisas.tools.mysql;


import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import pe.sonrisas.tools.dao.PacienteDAO;
import pe.sonrisas.tools.entities.Reservacita;

/**
 *
 * @author DIEGOALV
 */
public class ReservaDAOMysql {

    Conexion_BD co = new Conexion_BD();
    ResultSet rs = null;
    CallableStatement cs;

    /*
     * REGISTRA UNA NUEVA RESERVA DE CITA
     */
    public int agregarReservacita(Reservacita reserva, int idontologo) {

        int inserto = 0;

        try {
            co.Conectar();
            co.getCn().setAutoCommit(false); 
            String query = " { CALL usp_registrar_reservacita (?,?,?,?,?)}";
            
            cs = co.getCn().prepareCall(query);
            /* Seteamos parametros */
            cs.setInt(1, reserva.getIdPaciente());
            cs.setInt(2, idontologo);
            //cs.setDouble(3, reserva.getAdelanto());
            //cs.setInt(4, reserva.getAdelanto());
            cs.setString(5, reserva.getFecha().toString());
            /* Ejecutamos y validamos la transacción */
            cs.executeUpdate();
            co.getCn().commit();
            
          
            
            inserto = 1;
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(ReservaDAOMysql.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            System.out.println(""+ex.getMessage());;
            inserto = 2;

        }

        //Desconecta de la BD
        try {
            co.Desconectar();
        } catch (Exception ex) {
            Logger.getLogger(ReservaDAOMysql.class.getName()).log(Level.SEVERE, null, ex);
        }


        return inserto;

    }
    
    public int agregarReservacitaNoPaciente(Reservacita reserva, int idontologo) {

        int inserto = 0;

        try {
            co.Conectar();
            co.getCn().setAutoCommit(false); 
            String query = " { CALL usp_registrar_reservacita_nuevop (?,?,?,?,?)}";
            
            cs = co.getCn().prepareCall(query);
            /* Seteamos parametros */
            cs.setInt(1, reserva.getIdPersona());
            cs.setInt(2, idontologo);
            cs.setInt(3, reserva.getIdMotivo().getIdMotivo().intValue());
            cs.setDouble(4, reserva.getAdelanto().doubleValue());
            cs.setString(5, reserva.getFecha().toString());
            /* Ejecutamos y validamos la transacción */
            cs.executeUpdate();
            co.getCn().commit();
      
            inserto = 1;
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(ReservaDAOMysql.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            System.out.println(""+ex.getMessage());;
            inserto = 2;

        }

        //Desconecta de la BD
        try {
            co.Desconectar();
        } catch (Exception ex) {
            Logger.getLogger(ReservaDAOMysql.class.getName()).log(Level.SEVERE, null, ex);
        }


        return inserto;

    }
    
    
    
    
    
    
    

    public Vector<Vector> listarReservacitasPorFechas(String fecha, int cmp) {
        Vector<Vector> listado = new Vector<Vector>();


        try {
            co.Conectar();  //Conectamos a la bd
            String query = "SELECT r.idReservacitaCita,r.fecha,p.nombres,p.apellidoPaterno,p.apellidoMaterno,p.telefono,p.celular,m.nombre,p.idPersona,r.activoReservacitarCita from reservacita r, persona p,motivo m, odontologo o "+
                           "WHERE r.idPERSONA = p.idPERSONA AND r.fecha BETWEEN '"+ fecha +" 00:00:00' AND '"+ fecha +" 23:59:59' "+
                           "AND r.idMotivo = m.idMotivo AND o.id = r.Odontologo_id and o.CMP = "+ cmp + 
                           " UNION SELECT r.idReservacitaCita,r.fecha,p.nombres,p.apellidoPaterno,p.apellidoMaterno,p.telefono,p.celular,m.nombre,p.idPersona,r.activoReservacitarCita from reservacita r, persona p,paciente pa,motivo m, odontologo o "+
                           " WHERE r.idPaciente = pa.idPaciente AND p.idPERSONA = pa.idPERSONA AND r.idMotivo = m.idMotivo AND o.id = r.Odontologo_id and o.CMP = "+ cmp + 
                           " AND r.fecha BETWEEN '"+ fecha +" 00:00:00' AND '"+ fecha +" 23:59:59'";
            System.out.println(query);
            rs = co.Consultar(query);
            
                int fila = 0;
                while (rs.next()) {
                    Vector item = new Vector();
                    item.add(rs.getString(1));
                    item.add(rs.getString(2));
                    item.add(rs.getString(3));
                    item.add(rs.getString(4));
                    item.add(rs.getString(8));   
                    item.add(rs.getString(9));     
                    listado.add(item);
                    
                }
            

        } catch (ClassNotFoundException ex) {
            Logger.getLogger(ReservaDAOMysql.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(ReservaDAOMysql.class.getName()).log(Level.SEVERE, null, ex);
        }

        //Desconectamos
        try {
            co.Desconectar();
        } catch (Exception ex) {
            Logger.getLogger(ReservaDAOMysql.class.getName()).log(Level.SEVERE, null, ex);
        }

        return listado;

    }    //Fin  listarReservacitasPorFechas()

    /*
     * Lista los reportes para el frmReportes
     */
    public Vector<Vector> listarReporte(String query, int op) {

        Vector<Vector> listado = new Vector<Vector>();
        try {


            co.Conectar();
            rs = co.Consultar(query);
            int fila = 0;


            if (rs.first()) {
                while (!rs.isAfterLast()) {
                    Vector item = new Vector();
                    if (op == 1) {
                        item.add(rs.getString(1));
                        item.add(rs.getString(2));
                        item.add(rs.getString(3));
                        item.add(rs.getString(4));
                        item.add(rs.getString(5));
                        item.add(rs.getString(6));
                        item.add(rs.getString(7));
                        item.add(rs.getString(8));
                        item.add(rs.getString(9));
                        item.add(op);
                    } else {
                        item.add(rs.getString(1));
                    }
                    listado.add(item);
                    rs.next();
                }
            }
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(ReservaDAOMysql.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(ReservaDAOMysql.class.getName()).log(Level.SEVERE, null, ex);
        }

        //Desconecta de la BD
        try {
            co.Desconectar();
        } catch (Exception ex) {
            Logger.getLogger(ReservaDAOMysql.class.getName()).log(Level.SEVERE, null, ex);
        }

        return listado;

    }   //Fin_listaReporte()

    /*
     * METODO PARA CANCELAR O MODIFICAR UNA RESERVA
     */
    //int opcion 1 = Cancelar
    //int opcion 2 = Modificar
    public int editarReservacita(Reservacita reserva, int opcion) {

        int retorna = 0;

        try {
            String query = "";
            switch (opcion) {
                /*
                 * Cancelar reserva
                 */ case 1:
                    query = "execute sp_cancelar_reserva '" + reserva.getIdReservaCita().intValue() + "','" + reserva.getFecha() + "'";
                    retorna = 1;
                    break;
                /*
                 * Modificar reserva
                 */ case 2:
                    query = "execute sp_modificar_reserva '" + reserva.getIdReservaCita().intValue() + "','" + reserva.getFecha() + "','" + reserva.getIdMotivo().getNombre() + "'";
                    retorna = 2;
                    break;
            }
            co.Conectar();
            co.insupdel(query);

            return retorna;
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(ReservaDAOMysql.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(ReservaDAOMysql.class.getName()).log(Level.SEVERE, null, ex);
            return retorna;
        }



        try {
            co.Desconectar();
        } catch (Exception ex) {
            Logger.getLogger(ReservaDAOMysql.class.getName()).log(Level.SEVERE, null, ex);
        }

        return retorna;
    }

    public List<Map<String, Object>> reporteOdontologoSolicitadoPorMes(int opcionmes) {
        CallableStatement cstm = null;  // sirve para trabajar con un store procedure
        ResultSet rs = null;            // donde se guardan la respuesta del query
        String sql = null;              // Guarda query para luego ser enviado
        List<Map<String, Object>> odontologos =
                new ArrayList<Map<String, Object>>();
        try {
            co.Conectar();            
            sql = "{call usp_traer_reporteOdontologoSolicitadoPorMes(?)}";
            cstm = co.getCn().prepareCall(sql);        
            cstm.setInt(1, opcionmes);
           
            rs = cstm.executeQuery();// executeQuery() ---> Solo para consultas...
            while (rs.next()) {
                System.out.println("entroooo");
                Map odontologo = new HashMap();
                //Nombre y Cantidad son Key (llaves o identificadores)
                odontologo.put("Odontologo", rs.getString("nombre"));
                odontologo.put("Citas", rs.getInt("cantidad"));
                odontologos.add(odontologo);
            }

            co.Desconectar();
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        } finally {
            try {
                rs.close();
                cstm.close();
            } catch (SQLException ex) {
                Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return odontologos;          
       
    }

    public List<Map<String, Object>> reporteReservacitasPorTratamientoyMes(int opcionmes) {
        CallableStatement cstm = null;  // sirve para trabajar con un store procedure
        ResultSet rs = null;            // donde se guardan la respuesta del query
        String sql = null;              // Guarda query para luego ser enviado
        List<Map<String, Object>> tratamientos =
                new ArrayList<Map<String, Object>>();
        try {
            co.Conectar();            
            sql = "{call usp_traer_reporteReservacitasPorTratamientoyMes(?)}";
            cstm = co.getCn().prepareCall(sql);        
            cstm.setInt(1, opcionmes);
           
            rs = cstm.executeQuery();// executeQuery() ---> Solo para consultas...
            while (rs.next()) {
                System.out.println("entroooo");
                Map tratamiento = new HashMap();
                //Nombre y Cantidad son Key (llaves o identificadores)
                tratamiento.put("Tratamiento", rs.getString("tratamiento"));
                tratamiento.put("Reservacitas", rs.getInt("cantidad"));
                tratamientos.add(tratamiento);
            }

            co.Desconectar();
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        } finally {
            try {
                rs.close();
                cstm.close();
            } catch (SQLException ex) {
                Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return tratamientos;       
    }

    public List<Map<String, Object>> reporteCitasDeOdontologosPorFecha(String fechainicio, String fechafin) {
        CallableStatement cstm = null;  // sirve para trabajar con un store procedure
        ResultSet rs = null;            // donde se guardan la respuesta del query
        String sql = null;              // Guarda query para luego ser enviado
        List<Map<String, Object>> citas =
                new ArrayList<Map<String, Object>>();
        try {
            co.Conectar();            
            sql = "{call usp_traer_reporteCitasDeOdontologosPorFecha(?,?,?)}";
            cstm = co.getCn().prepareCall(sql);        
            cstm.setString(1, fechainicio);
            cstm.setString(2, fechafin); 
            rs = cstm.executeQuery();// executeQuery() ---> Solo para consultas...
            while (rs.next()) {
                System.out.println("entroooo");
                Map cita = new HashMap();
                //Nombre y Cantidad son Key (llaves o identificadores)
                cita.put("Odontologo", rs.getString("nombre"));
                cita.put("Citas", rs.getInt("cantidad"));
                citas.add(cita);
            }

            co.Desconectar();
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        } finally {
            try {
                rs.close();
                cstm.close();
            } catch (SQLException ex) {
                Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return citas;       
        
    }

    public List<Map<String, Object>> reporteReservacitaCanceladaPorFecha(String fechainicio, String fechafin) {
         CallableStatement cstm = null;  // sirve para trabajar con un store procedure
        ResultSet rs = null;            // donde se guardan la respuesta del query
        String sql = null;              // Guarda query para luego ser enviado
        List<Map<String, Object>> reservas =
                new ArrayList<Map<String, Object>>();
        try {
            co.Conectar();            
            sql = "{call usp_traer_reporteReservacitaCanceladaPorFecha(?,?)}";
            cstm = co.getCn().prepareCall(sql);        
            cstm.setString(1, fechainicio);
            cstm.setString(2, fechafin); 
            rs = cstm.executeQuery();// executeQuery() ---> Solo para consultas...
            while (rs.next()) {
                System.out.println("entroooo");
                Map reserva = new HashMap();
                //Nombre y Cantidad son Key (llaves o identificadores)
                reserva.put("Tratamiento", rs.getString("trata"));
                reserva.put("Cantidad", rs.getInt("cantidad"));
                reservas.add(reserva);
            }

            co.Desconectar();
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        } finally {
            try {
                rs.close();
                cstm.close();
            } catch (SQLException ex) {
                Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return reservas; 
    }

    public List<Map<String, Object>> reporteIngresoPorMes(int opcionmes) {
        CallableStatement cstm = null;  // sirve para trabajar con un store procedure
        ResultSet rs = null;            // donde se guardan la respuesta del query
        String sql = null;              // Guarda query para luego ser enviado
        List<Map<String, Object>> ingresos =
                new ArrayList<Map<String, Object>>();
        try {
            co.Conectar();            
            sql = "{call usp_traer_reporteIngresoPorMes(?)}";
            cstm = co.getCn().prepareCall(sql);        
            cstm.setInt(1, opcionmes);
           
            rs = cstm.executeQuery();// executeQuery() ---> Solo para consultas...
            while (rs.next()) {
                System.out.println("entroooo");
                Map ingreso = new HashMap();
                //Nombre y Cantidad son Key (llaves o identificadores)
                ingreso.put("Mes", rs.getString("mes"));
                ingreso.put("Ingreso", rs.getInt("monto"));
                ingresos.add(ingreso);
            }

            co.Desconectar();
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        } finally {
            try {
                rs.close();
                cstm.close();
            } catch (SQLException ex) {
                Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return ingresos; 
    }

    public List<Map<String, Object>> reporteIngresoMensuales() {
        CallableStatement cstm = null;  // sirve para trabajar con un store procedure
        ResultSet rs = null;            // donde se guardan la respuesta del query
        String sql = null;              // Guarda query para luego ser enviado
        List<Map<String, Object>> ingresos =
                new ArrayList<Map<String, Object>>();
        try {
            co.Conectar();            
            sql = "{call usp_traer_reporteIngresoMensuales()}";
            cstm = co.getCn().prepareCall(sql);        
            rs = cstm.executeQuery();// executeQuery() ---> Solo para consultas...
            while (rs.next()) {
                System.out.println("entroooo");
                Map ingreso = new HashMap();
                //Nombre y Cantidad son Key (llaves o identificadores)
                ingreso.put("Mes", rs.getString("meses"));
                ingreso.put("Montos", rs.getInt("total"));
                ingresos.add(ingreso);
            }

            co.Desconectar();
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        } finally {
            try {
                rs.close();
                cstm.close();
            } catch (SQLException ex) {
                Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return ingresos; 
    }

    public List<Map<String, Object>> reporteOdontologoPorFecha(String fechainicio, String fechafin, int idubigeo) {
        CallableStatement cstm = null;  // sirve para trabajar con un store procedure
        ResultSet rs = null;            // donde se guardan la respuesta del query
        String sql = null;              // Guarda query para luego ser enviado
        List<Map<String, Object>> Odontologos =
                new ArrayList<Map<String, Object>>();
        try {
            co.Conectar();            
            sql = "{call usp_traer_reporteOdontologoPorFecha(?,?,?)}";
            cstm = co.getCn().prepareCall(sql);        
            cstm.setString(1, fechainicio);
            cstm.setString(2, fechafin); 
            cstm.setInt(3, idubigeo);
            rs = cstm.executeQuery();// executeQuery() ---> Solo para consultas...
            while (rs.next()) {
                System.out.println("entroooo");
                Map odontologo = new HashMap();
                //Nombre y Cantidad son Key (llaves o identificadores)
                odontologo.put("name", rs.getString("nombre"));
                odontologo.put("total", rs.getInt("cantidad"));
                Odontologos.add(odontologo);
            }

            co.Desconectar();
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        } finally {
            try {
                rs.close();
                cstm.close();
            } catch (SQLException ex) {
                Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return Odontologos; 
    }

    public List<Map<String, Object>> reporteTratamientoMesJunio(int opcionmes) {
        
         CallableStatement cstm = null;  // sirve para trabajar con un store procedure
        ResultSet rs = null;            // donde se guardan la respuesta del query
        String sql = null;              // Guarda query para luego ser enviado
        List<Map<String, Object>> tratamientos =
                new ArrayList<Map<String, Object>>();
        try {
            co.Conectar();            
            sql = "{call usp_traer_reporteTratamientoMesJunio(?)}";
            cstm = co.getCn().prepareCall(sql);        
            cstm.setInt(1, opcionmes);
           
            rs = cstm.executeQuery();// executeQuery() ---> Solo para consultas...
            while (rs.next()) {
                System.out.println("entroooo");
                Map tratamiento = new HashMap();
                //Nombre y Cantidad son Key (llaves o identificadores)
                tratamiento.put("Tratamiento", rs.getString("tratamiento"));
                tratamiento.put("Reservacitas", rs.getInt("cantidad"));
                tratamientos.add(tratamiento);
            }

            co.Desconectar();
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        } finally {
            try {
                rs.close();
                cstm.close();
            } catch (SQLException ex) {
                Logger.getLogger(PacienteDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return tratamientos;   
        
        
        
    }
}

